page.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. 'use server';
  2. import View from './view';
  3. import { notFound, forbidden, redirect } from 'next/navigation';
  4. import { BoardLayout } from '@/constants/forum';
  5. import { checkAuthServer } from '@/lib/api/auth';
  6. import { fetchBoard } from '@/lib/api/forum/board';
  7. import { fetchPostData } from '@/lib/api/forum/post';
  8. import { checkPermission } from '@/lib/utils/server';
  9. import PermissionDenied from '@/app/(main)/(forum)/board/_component/PermissionDenied';
  10. export default async function PostView({ params }: { params: Promise<{ id: string }> })
  11. {
  12. const { id } = await params;
  13. if (!/^\d+$/.test(id)) {
  14. return forbidden();
  15. }
  16. // 게시글 정보 조회
  17. const post = await fetchPostData(Number(id));
  18. if (!post.success || !post.data) {
  19. return notFound();
  20. }
  21. // 게시판 조회
  22. const board = await fetchBoard(post.data.boardCode);
  23. if (!board || !board.data) {
  24. return notFound();
  25. }
  26. if (!board.data.isActive) {
  27. return forbidden();
  28. }
  29. if (!board.data.boardMeta) {
  30. throw new Error('게시판 속성을 찾을 수 없습니다.');
  31. }
  32. // 1:1 게시판은 로그인한 사용자만 접근 가능
  33. if (board.data.boardMeta.list.layout === BoardLayout.QnA && !await checkAuthServer()) {
  34. redirect('/login');
  35. }
  36. // 게시판 접근 권한 확인
  37. if (!await checkPermission(board.data.boardMeta.permission.boardAccess, board.data.boardManager)) {
  38. return <PermissionDenied _board={board.data} />;
  39. }
  40. // 게시글 열람 권한 확인
  41. if (!await checkPermission(board.data.boardMeta.permission.postView, board.data.boardManager)) {
  42. return <PermissionDenied _board={board.data} />;
  43. }
  44. return (
  45. <View _board={board.data} _post={post.data} />
  46. );
  47. }